﻿using MedicalLog.Domain.Entities;
using System.Linq;
using System.Collections.Generic;
using System;

namespace MedicalLog.Domain.Repositories
{
    public class PatientsRepository
    {
  
        MedicalLogEntities _dbMedicalLog;
        public PatientsRepository()
        {
            _dbMedicalLog = new MedicalLogEntities();
        }

        /// <summary>
        /// Este método se encarga de grabar un paciente en
        /// la base de datos utilizando el objeto de contexto de EF 4.
        /// </summary>
        /// <param name="newPatient"></param>
        public void AddPatient(Patient newPatient)
        {
            _dbMedicalLog.AddToPatients(newPatient);
            _dbMedicalLog.SaveChanges();
        }

        /// <summary>
        /// Este método se encarga de buscar un Patient según el id y devolverlo para su 
        /// posterior eliminación.
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Patient DeletePatient(int id)
        {
            var patient = _dbMedicalLog.Patients.First(p => p.Id == id);
            return patient;
        }


        /// <summary>
        /// Este método en una sobrecarga del método DeletePatient, este se encarga
        /// de buscar el patient según el id y luego borrarlo completamente de la 
        /// base de datos.
        /// </summary>
        /// <param name="id"></param>
        /// <param name="confirmation"></param>
        public void DeletePatient(int id, string confirmation)
        {
            var patient = _dbMedicalLog.Patients.First(p => p.Id == id);
            if (patient != null)
            {
                _dbMedicalLog.Patients.DeleteObject(patient);
                _dbMedicalLog.SaveChanges();
            }
        }

        /// <summary>
        /// (Consulta de paciente)
        /// Este método se encarga de buscar un patient según el id y luego pasarlo 
        /// de vuelta para mostrar el detalle del patient.
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Patient DetailPatient(int id)
        {
            var patient = _dbMedicalLog.Patients.First(p => p.Id == id);
            return patient;
        }


        /// <summary>
        /// Este método se encarga de buscar un patient según el id para actualizarlo.
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Patient UpdatePatient(int id)
        {
            var patient = _dbMedicalLog.Patients.First(p => p.Id == id);
            return patient;
        }


        /// <summary>
        /// Este método se encarga de actualizar un patient en la base de dastos
        /// según el objeto patient que se le pase.
        /// </summary>
        /// <param name="patient"></param>
        public void UpdatePatient(Patient patient)
        {
            _dbMedicalLog.Patients.FirstOrDefault(p => p.Id == patient.Id);
            _dbMedicalLog.Patients.ApplyCurrentValues(patient);
            _dbMedicalLog.SaveChanges();
        }

        /// <summary>
        /// Este método se encarga de buscar un patient segun el cédula
        /// que se le pase y devolver el patient que consida con la cédula.
        /// </summary>
        /// <param name="idCedula"></param>
        /// <returns></returns>
        public Patient SearchPatient(string idCedula) 
        {
            try
            {
                var patient = _dbMedicalLog.Patients.FirstOrDefault(p => p.IdentificationNumber.Equals(idCedula));
                return patient;
            }
            catch (InvalidOperationException ex)
            {
                if (ex.Message.Equals("Sequence contains no elements"))
                {
                    throw;
                }
               
            }

            return new Patient();
        }

        //TODO
        public List<Patient> TrackPatients()
        {
            //TODO
            return new List<Patient>();
        }
    }

}
